<?php
set_time_limit ( 0 );
require_once 'frases.php';
class ocorrencia_populatorModel extends Object{

    private $sizeofpage      = 1000;
    private $count           = 100000;
    private $childrenprob    = 2;
    private $words           = array();
    private $paragraphs      = array();
    private $usuarios        = array();
    private $groups          = array();

    public function __construct() {
        
    }
    
    public function init(){
        $this->paragraphs = getParagraph();
        $this->words      = getWords();
        $this->LoadResource('database', 'db');
        
        $this->LoadModel('ocorrencia/grupo', 'gr');
        $this->groups = $this->gr->getAllGroups();
        
        $this->LoadModel('ocorrencia/pertence', 'per');
        $pertence = $this->per->selecionar();
        if(!empty ($pertence)){
            foreach($pertence as $per){
                $this->pertence[$per['cod_grupo']][] = $per['cod_usuario'];
            }
        }
        $this->LoadModel('usuario/login', 'uobj');
        $this->usuarios = $this->uobj->selecionar(array('cod_usuario'));
        
        $this->LoadModel('ocorrencia/ocorrencias', 'oc');
        $this->ocorrencias = $this->oc->selecionar(array('cod_ocorrencia'));
        
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $envolvido = $this->env->selecionar(array('cod_ocorrencia', 'cod_usuario'));
        if(!empty ($envolvido)){
            foreach($envolvido as $env){
                $this->envolvido[$env['cod_ocorrencia']][] = $env['cod_usuario'];
            }
        }
    }
    
    public function populate(){
        $this->init();
        $this->populateUsers();
        $this->populateGroup();
        $this->populateOcorrencias();
        $this->populateMensagens();
    }
    
    private function getWord($min = 1, $max = 3){
        if($min < 0) $min = 1;
        if($max < $min) $max = $min + 1;
        $var = "";
        $num = ($min == $max)? $min: rand($min, $max);
        $esp = "";
        while($num != 0){
            $var .= $esp.$this->words[rand(0, count($this->words)-1)];
            $num--;
            $esp = " ";
        }
        return $var;
    }
    
    private function getUser(){
        return $this->usuarios[rand(0, count($this->usuarios) - 1)]['cod_usuario'];
    }
    
    private function getParagraph(){
        return $this->paragraphs[rand(0, count($this->paragraphs) - 1)];
    }
    
    private function populateOcorrencias(){
        $occount = $this->count/20;
        $max = $occount - $this->oc->getCount();
        if($max < 1) return;
        
        $tipos  = array('andamento', 'concluido', 'paralisado', 'cancelado', 'excluido');
        $query  = "INSERT INTO ocorrencia_ocorrencias (cod_ocorrencia, grupo, assunto, tipo, status_label, solicitante, previsao_encerramento, descricao) VALUES ";
        $query2 = "INSERT INTO ocorrencia_envolvido(cod_usuario, cod_ocorrencia, tipo_envolvimento, lida, importante, data_envolvimento) VALUES ";
        $pages = ceil($max/$this->sizeofpage);
        if($max > $this->sizeofpage) $max = $this->sizeofpage;
        
        $cod_ocorrencia = array();
        $cod_ocorrencia = $this->oc->selecionar(array('cod_ocorrencia'), "", 1, "", "cod_ocorrencia DESC");
        $cod_ocorrencia = (empty ($cod_ocorrencia))?1:$cod_ocorrencia[0]['cod_ocorrencia'];
        
        $j = 0;
        $maxj = count($this->groups);
        while($pages > 0){
            $i = 0;
            $v = $virg = '';
            while($i < $max){
                $j++;
                if($maxj == $j) $j = 0;
                
                $cod_ocorrencia++;
                $this->ocorrencias[]['cod_ocorrencia'] = $cod_ocorrencia;
                $grupo          = $this->groups[$j]['cod_grupo']; 
                $assunto        = $this->getWord(); 
                $tipo           = $tipos[rand(0, 4)]; 
                $status_label   = $this->getWord(1,3); 
                $solicitante    = $this->getUser(); 
                $encerramento   = $this->randDate();
                $descricao      = $this->getParagraph();
                $query         .= "$virg('$cod_ocorrencia', '$grupo', '$assunto', '$tipo', '$status_label', '$solicitante', '$encerramento', '$descricao')";
                $virg           = ",";
                $i++;
                
                $lida = $importante = 'n';
                $tipo_envolvimento = 'envolvido';
                foreach($this->pertence[$grupo] as $cod_usuario){
                    $this->envolvido[$cod_ocorrencia][] = $cod_usuario;
                    $data_envolvimento = $this->randDate();
                    $query2 .= "$v ('$cod_usuario', '$cod_ocorrencia', '$tipo_envolvimento', '$lida', '$importante', '$data_envolvimento') ";
                    $v = ", ";
                }
            }
            //echo $query2 . "<hr/>";
            $this->db->executeQuery($query);
            $this->db->executeQuery($query2);
            $query = $query2 = "";
            $pages--;
        }
    }
    
    private function populateMensagens(){
        $this->LoadModel('ocorrencia/mensagem', 'msg');
        $max = $this->count - $this->msg->getCount();
        if($max < 1) return;
        $pages = ceil($max/$this->sizeofpage);
        if($max > $this->sizeofpage) $max = $this->sizeofpage;
        $saved_max = $max;
        
        $cod_mensagem = $this->msg->selecionar(array('cod_mensagem'), "", 1, "", "cod_mensagem DESC");
        $cod_mensagem = (empty ($cod_mensagem))?0:$cod_mensagem[0]['cod_mensagem'];
        
        $j = 0;
        $maxj = count($this->ocorrencias);
        while($pages > 0){
            $query  = "INSERT INTO ocorrencia_mensagem (cod_mensagem, cod_ocorrencia, cod_autor, data, texto) VALUES ";
            $query2 = "INSERT INTO ocorrencia_lida(cod_mensagem, cod_usuario) VALUES ";
            $v = $virg = '';
            $max = $saved_max;
            while($max >= 0){
                $repeat = rand(1, 3);
                $j++;
                if($maxj == $j) $j = 0;
                while($repeat > 0){
                    $cod_mensagem++;
                    $cod_ocorrencia = $this->ocorrencias[$j]['cod_ocorrencia']; 
                    if(array_key_exists($cod_ocorrencia, $this->envolvido)){
                        $rand      = rand(0, count($this->envolvido[$cod_ocorrencia])-1);
                        $cod_autor = $this->envolvido[$cod_ocorrencia][$rand];
                    }else $cod_autor = $this->getUser();

                    $data      = $this->randDate();
                    $texto     = $this->getParagraph();
                    $query         .= "$virg('$cod_mensagem', '$cod_ocorrencia', '$cod_autor', '$data', '$texto')";
                    $virg           = ",";
                    if(array_key_exists($cod_ocorrencia, $this->envolvido)){
                        foreach($this->envolvido[$cod_ocorrencia] as $cod_usuario){
                            $query2 .= "$v ('$cod_mensagem', '$cod_usuario') ";
                            $v = ", ";
                        }
                    }
                    $repeat--;
                }
                $max--;
                
            }
            //die($query2);
            //echo $query2 . "<hr/>";
            $this->db->executeQuery($query);
            $this->db->executeQuery($query2);
            $pages--;
        }
    }
    
    private function populateGroup(){
        $grcount = ceil($this->count/200);
        if($grcount > 100) $grcount = 100;
        $grcount =  (int)($grcount - $this->gr->getCount());
        if($grcount < 1) return;
        $cod_grupo = isset($this->groups[0])?$this->groups[0]['cod_grupo'] + $grcount:"1000";
        $query  = "INSERT INTO ocorrencia_grupo (cod_grupo, cod_pai, nome) VALUES ";
        $query2 = "INSERT IGNORE INTO ocorrencia_pertence (cod_grupo, cod_usuario) VALUES ";
        $virg = $virgula = "";
        while($grcount > 0){
            //if($grcount < 95) die("$grcount -- loop?");
            $num = rand(0, 10);
            $cod_pai = "NULL";
            $cod_grupo++;
            if($num >= $this->childrenprob){
                $cod_pai = $cod_grupo;
                $i = 0;
                while($cod_pai == $cod_grupo){
                    $index = rand(0, count($this->groups)-1);
                    $cod_pai = empty ($this->groups)?"NULL": "'".$this->groups[$index]['cod_grupo']."'";
                    //$i++;
                    //if($i == 5) die("loop??");
                }
            }
            $nome = $this->words[rand(0, count($this->words)-1)];
            $this->groups[] = array('cod_grupo' => $cod_grupo);
            $query  .= "$virg ('$cod_grupo', $cod_pai, '$nome') ";
            $virg = ", ";
            $grcount--;
            
            $numusers = rand(3, 10);
            $user_arr = array();
            while($numusers > 0){
                $cod_usuario = $this->getUser();
                while(in_array($cod_usuario, $user_arr)){
                    $cod_usuario = $this->getUser();
                }
                $user_arr[] = $cod_usuario;
                $this->pertence[$cod_grupo][] = $cod_usuario;
                $query2 .= "$virgula ('$cod_grupo','$cod_usuario')"; 
                $virgula = ", ";
                $numusers--;
            }
        }

        $this->db->executeQuery($query);
        $this->db->executeQuery($query2);        
    }
    
    private function randDate(){
        $var = (string)date("Y-m-d H:i:s", mt_rand( 1230671839, 1365055681 ));
        return $var;
    }
    
    private function populateUsers(){
        $grcount = $this->count/200;
        if($grcount > 100) $grcount = 50;
        $grcount -= $this->uobj->getCount();
        if($grcount < 1) return;
        $cod_usuario = "";
        $query       = "INSERT INTO usuario (cod_usuario, email, senha, permissao) VALUES ";
        $permissao   = "Visitante";
        $senha       = "PASSWORD('12tm3flol')";
        $arr         = $this->uobj->selecionar(array('cod_usuario'), "", 1, "", "cod_usuario DESC");
        $cod_usuario = (empty ($arr))?0:$arr[0]['cod_usuario'];
        $v = "";
        while($grcount > 0){
            $cod_usuario++;
            $email = $this->randmail();
            $query.= "$v ('$cod_usuario', '$email', $senha, '$permissao')";
            $v = ", ";
            $grcount--;
            $this->usuarios[]['cod_usuario'] = $cod_usuario;
        }
        $this->db->executeQuery($query);
    }
    
    private function randmail(){
         $tlds = array("com", "net", "gov", "org", "edu", "biz", "info");
         $char = "0123456789abcdefghijklmnopqrstuvwxyz";
         $dlen = mt_rand(7, 17);
         $w1 = GetPlainName($this->getWord('1', '1'));
         $w2 = GetPlainName($this->getWord('1', '1'));
         $a  = "$w1@$w2.".$tlds[mt_rand(0, (sizeof($tlds)-1))];
         return $a;
    }
    
}

?>